/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tramite.bc;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.cip.esymons.general.bc.ConsejoDepartamentalFacadeLocal;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.tramite.be.DocumentoGenerado;
import org.cip.esymons.tramite.be.DocumentoIncluido;
import org.cip.esymons.tramite.be.EnumEstadoCert;
import org.cip.esymons.tramite.be.SecuenciaDocumento;
import org.cip.esymons.tramite.be.TipoDocumento;
import org.cip.esymons.tramite.be.Tramite;

/**
 *
 * @author Freddy Infantes
 */
@Stateless
public class DocumentoGeneradoFacade implements DocumentoGeneradoFacadeLocal {

    @EJB
    SecuenciaDocumentoFacadeLocal secuenciaFacade;
    @EJB
    ConsejoDepartamentalFacadeLocal consejoFacade;
    @PersistenceContext
    private EntityManager em;

    public void create(DocumentoGenerado documentoGenerado) {
        em.persist(documentoGenerado);
    }

    public void edit(DocumentoGenerado documentoGenerado) {
        em.merge(documentoGenerado);
    }

    public void remove(DocumentoGenerado documentoGenerado) {
        em.remove(em.merge(documentoGenerado));
    }

    public DocumentoGenerado find(Object id) {
        return em.find(DocumentoGenerado.class, id);
    }

    public List<DocumentoGenerado> findAll() {
        return em.createQuery("select object(o) from DocumentoGenerado as o").getResultList();
    }

    public List<DocumentoGenerado> listarBorradoresXSolicitante(Solicitante sol) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select d");
            sb.append(" from DocumentoGenerado d");
            sb.append(" where d.fkSolCodigo=?1 and d.fkTdoCodigo.tdoDesc=?2");

            q = em.createQuery(sb.toString());

            q.setParameter(1, sol);
            q.setParameter(2, "Borrador");

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<DocumentoIncluido> listarCertificadosExpor(Date ini, Date fin, Tramite t, EnumEstadoCert estado) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select di from DocumentoGenerado dg, DocumentoIncluido di, Operacion op, Transaccion tr, Certificado c");
            sb.append(" where dg.docCodigo = di.fkDocCodigo.docCodigo and dg.certificado = c and di.fkOpeCodigo=op");
            sb.append(" and op.fkTraCodigo=tr and c.chaFechemision >= ?1 and c.chaFechemision <= ?2");
            if (t != null) {
                sb.append(" and tr.fkTrmCodigo=?3");
                if (estado != null) {
                    sb.append(" and c.chaEstado=?4");
                }
            } else if (estado != null) {
                sb.append(" and c.chaEstado=?3");
            }

            q = em.createQuery(sb.toString());
            q.setParameter(1, ini);
            q.setParameter(2, fin);

            if (t != null) {
                q.setParameter(3, t);
                if (estado != null) {
                    q.setParameter(4, estado);
                }
            } else if (estado != null) {
                q.setParameter(3, estado);
            }

            return q.getResultList();
        } catch (Exception e) {
            return new ArrayList<DocumentoIncluido>();
        }
    }

    public List<DocumentoIncluido> listarCertificados(Date ini, Date fin, Solicitante solicitante, Solicitante solicitado, Tramite t, String numero) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select di from DocumentoGenerado dg, DocumentoIncluido di, Operacion op, Transaccion tr");
            sb.append(" where dg.docCodigo = di.fkDocCodigo.docCodigo and di.fkOpeCodigo=op and op.fkTraCodigo=tr and tr.fkTrmCodigo=?1");

            if (solicitante != null) {
                sb.append(" and tr.fkSolCodigo=?2");
                if (solicitado != null) {
                    sb.append(" and tr.fkSolicitado=?3");
                    if (!numero.isEmpty()) {
                        sb.append(" and dg.docNumero=?4");
                        if (ini != null) {
                            sb.append(" and dg.certificado.chaFechemision>=?5");
                            if (fin != null) {
                                sb.append(" and dg.certificado.chaFechemision<=?6");
                            }
                        } else if (fin != null) {
                            sb.append(" and dg.certificado.chaFechemision<=?5");
                        }
                    } else if (ini != null) {
                        sb.append(" and dg.certificado.chaFechemision>=?4");
                        if (fin != null) {
                            sb.append(" and dg.certificado.chaFechemision<=?5");
                        }
                    } else if (fin != null) {
                        sb.append(" and dg.certificado.chaFechemision<=?4");
                    }
                } else if (!numero.isEmpty()) {
                    sb.append(" and dg.docNumero=?3");
                    if (ini != null) {
                        sb.append(" and dg.certificado.chaFechemision>=?4");
                        if (fin != null) {
                            sb.append(" and dg.certificado.chaFechemision<=?5");
                        }
                    } else if (fin != null) {
                        sb.append(" and dg.certificado.chaFechemision<=?4");
                    }
                } else if (ini != null) {
                    sb.append(" and dg.certificado.chaFechemision>=?3");
                    if (fin != null) {
                        sb.append(" and dg.certificado.chaFechemision<=?4");
                    }
                } else if (fin != null) {
                    sb.append(" and dg.certificado.chaFechemision<=?3");
                }
            } else if (solicitado != null) {
                sb.append(" and tr.fkSolicitado=?2");
                if (!numero.isEmpty()) {
                    sb.append(" and dg.docNumero=?3");
                    if (ini != null) {
                        sb.append(" and dg.certificado.chaFechemision>=?4");
                        if (fin != null) {
                            sb.append(" and dg.certificado.chaFechemision<=?5");
                        }
                    } else if (fin != null) {
                        sb.append(" and dg.certificado.chaFechemision<=?4");
                    }
                } else if (ini != null) {
                    sb.append(" and dg.certificado.chaFechemision>=?3");
                    if (fin != null) {
                        sb.append(" and dg.certificado.chaFechemision<=?4");
                    }
                } else if (fin != null) {
                    sb.append(" and dg.certificado.chaFechemision<=?3");
                }
            } else if (!numero.isEmpty()) {
                sb.append(" and dg.docNumero=?2");
                if (ini != null) {
                    sb.append(" and dg.certificado.chaFechemision>=?3");
                    if (fin != null) {
                        sb.append(" and dg.certificado.chaFechemision<=?4");
                    }
                } else if (fin != null) {
                    sb.append(" and dg.certificado.chaFechemision<=?3");
                }
            } else if (ini != null) {
                sb.append(" and dg.certificado.chaFechemision>=?2");
                if (fin != null) {
                    sb.append(" and dg.certificado.chaFechemision<=?3");
                }
            } else if (fin != null) {
                sb.append(" and dg.certificado.chaFechemision<=?2");
            }

            q = em.createQuery(sb.toString());
            q.setParameter(1, t);

            if (solicitante != null) {
                q.setParameter(2, solicitante);
                if (solicitado != null) {
                    q.setParameter(3, solicitado);
                    if (!numero.isEmpty()) {
                        q.setParameter(4, numero);
                        if (ini != null) {
                            q.setParameter(5, ini);
                            if (fin != null) {
                                q.setParameter(6, fin);
                            }
                        } else if (fin != null) {
                            q.setParameter(5, fin);
                        }
                    } else if (ini != null) {
                        q.setParameter(4, ini);
                        if (fin != null) {
                            q.setParameter(5, fin);
                        }
                    } else if (fin != null) {
                        q.setParameter(4, fin);
                    }
                } else if (!numero.isEmpty()) {
                    q.setParameter(3, numero);
                    if (ini != null) {
                        q.setParameter(4, ini);
                        if (fin != null) {
                            q.setParameter(5, fin);
                        }
                    } else if (fin != null) {
                        q.setParameter(4, fin);
                    }
                } else if (ini != null) {
                    q.setParameter(3, ini);
                    if (fin != null) {
                        q.setParameter(4, fin);
                    }
                } else if (fin != null) {
                    q.setParameter(3, fin);
                }
            } else if (solicitado != null) {
                q.setParameter(2, solicitado);
                if (!numero.isEmpty()) {
                    q.setParameter(3, numero);
                    if (ini != null) {
                        q.setParameter(4, ini);
                        if (fin != null) {
                            q.setParameter(5, fin);
                        }
                    } else if (fin != null) {
                        q.setParameter(4, fin);
                    }
                } else if (ini != null) {
                    q.setParameter(3, ini);
                    if (fin != null) {
                        q.setParameter(4, fin);
                    }
                } else if (fin != null) {
                    q.setParameter(3, fin);
                }
            } else if (!numero.isEmpty()) {
                q.setParameter(2, numero);
                if (ini != null) {
                    q.setParameter(3, ini);
                    if (fin != null) {
                        q.setParameter(4, fin);
                    }
                } else if (fin != null) {
                    q.setParameter(3, fin);
                }
            } else if (ini != null) {
                q.setParameter(2, ini);
                if (fin != null) {
                    q.setParameter(3, fin);
                }
            } else if (fin != null) {
                q.setParameter(2, fin);
            }

            return q.getResultList();
        } catch (Exception e) {
            return new ArrayList<DocumentoIncluido>();
        }
    }

    public void guardarDocBorrador(DocumentoGenerado doc) {
        doc.setDocFecha(new Date());
        doc.setDocNumero("");
        create(doc);
    }

    public void guardarDocAdminist(DocumentoGenerado doc) {
        Integer sec;
        Calendar fecha = Calendar.getInstance();
        Integer anio = fecha.get(Calendar.YEAR);
        SecuenciaDocumento secuencia = secuenciaFacade.buscarUltimo(doc.getFkTdoCodigo(), doc.getArea());
        doc.setDocFecha(new Date());
        doc.setDocGlosa(doc.getArea().getAreAbrev().concat("/CIP/CDLL"));
        if (secuencia == null) {
            sec = 1;
            doc.setDocNumero("001-" + anio);
        } else {
            sec = secuencia.getSdoSecuencia().intValue();
            sec++;

            if (sec < 10) {
                doc.setDocNumero("00" + sec.toString() + "-" + anio);
            } else if (sec < 100) {
                doc.setDocNumero("0" + sec.toString() + "-" + anio);
            } else {
                doc.setDocNumero(sec.toString() + "-" + anio);
            }

        }
        create(doc);
        if (sec == 1) {
            secuenciaFacade.create(new SecuenciaDocumento(new BigInteger(sec.toString()), anio, doc.getFkTdoCodigo(), doc.getArea()));
        } else {
            secuencia.setSdoSecuencia(new BigInteger(sec.toString()));
            secuenciaFacade.edit(secuencia);
        }

    }

    public void guardarCertificado(DocumentoGenerado doc) {
        boolean band = false;
        Integer sec;

        Calendar fecha = Calendar.getInstance();
        Integer anio = fecha.get(Calendar.YEAR);
        SecuenciaDocumento secuencia = secuenciaFacade.buscarUltimoCert(doc.getFkTdoCodigo(), doc.getArea());
        doc.setDocFecha(new Date());
        if (secuencia == null) {
            band = true;
            sec =
                    1;
            doc.setDocNumero("000001");
        } else {
            sec = secuencia.getSdoSecuencia().intValue();
            sec++;

            if (sec < 10) {
                doc.setDocNumero("00000" + sec.toString());
            } else if (sec < 100) {
                doc.setDocNumero("0000" + sec.toString());
            } else if (sec < 1000) {
                doc.setDocNumero("000" + sec.toString());
            } else if (sec < 10000) {
                doc.setDocNumero("00" + sec.toString());
            } else if (sec < 100000) {
                doc.setDocNumero("0" + sec.toString());
            } else {
                doc.setDocNumero(sec.toString());
            }

        }
        create(doc);
        if (band) {
            secuenciaFacade.create(new SecuenciaDocumento(new BigInteger(sec.toString()), anio, doc.getFkTdoCodigo(), doc.getArea()));
        } else {
            secuencia.setSdoSecuencia(new BigInteger(sec.toString()));
            secuenciaFacade.edit(secuencia);
        }

    }

    public List<DocumentoGenerado> paginadorDocumentoGenerado(int cantidad, int posicion, String desc) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append("Select td From DocumentoGenerado dg ");


            if (desc != null && !desc.isEmpty()) {
                sb.append(" Where td.tdoDesc like ?1");
            }

            q = em.createQuery(sb.toString());

            if (desc != null && !desc.isEmpty()) {
                q.setParameter(1, "%" + desc + "%");
            }

            q.setFirstResult(posicion);
            q.setMaxResults(cantidad);
            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }

    }

    public int contarPaginadorDocumentoGenerado(String desc) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append("Select COUNT(td) From DocumentoGenerado td ");

            if (desc != null && !desc.isEmpty()) {
                sb.append(" Where td.tdoDesc =?1");
            }

            q = em.createQuery(sb.toString());

            if (desc != null && !desc.isEmpty()) {
                q.setParameter(1, desc);
            }

            return new Integer(q.getSingleResult().toString());
        } catch (Exception ex) {
            return 0;
        }
    }
}
